#include<stdio.h>
#include<malloc.h>
#define maxsize 100
//递归算法 
void hanoi1(int n,char a,char b,char c){
	if(n==1)
	  printf("\t将第%d个盘片从%c移动到%c\n",n,a,c);
	else
	{
		hanoi1(n-1,a,c,b);
		printf("\t将第%d个盘片从%c移动到%c\n",n,a,c);
		hanoi1(n-1,b,a,c);
	 } 
} 
//非递归算法
typedef struct{
	int n;
	char x,y,z;
	bool flag;
}elemtype;
typedef struct{
	elemtype data[maxsize];
	int top;
}stacktype;
//栈的基本操作 
void initstack(stacktype *&s){
	s=(stacktype *)malloc(sizeof(stacktype));
	s->top=-1;
}

void destroystack(stacktype *&s){
	free(s);
}

bool stackempty(stacktype *&s){
   return (s->top==-1);
}

bool push(stacktype *&s,elemtype e){
	if(s->top==maxsize-1)
	  return false;
	s->top++;
	s->data[s->top]=e;
	return true;
}

bool pop(stacktype *&s,elemtype &e){
	if(s->top==-1)
        return false;
    e=s->data[s->top]; 
    s->top--;
    return true;
}

void hanoi2(int n,char x,char y,char z){
	stacktype *st;
	elemtype e,e1,e2,e3;
	if(n<=0) return;
	initstack(st);
	e.n=n;e.x=x;e.y=y;e.z=z;
	e.flag=false;
	push(st,e);
	while(!stackempty(st)){
		pop(st,e);
		if(e.flag=false)
		{
			e1.n=e.n-1;e1.x=e.y;e1.y=e.x;e1.z=e.z;
			if(e1.n==1)
			  e1.flag=true;
			else
			  e1.flag=false;
		    push(st,e1);
		    e2.n=e.n;e2.x=e.x;e2.y=e.y;e2.z=e.z;
		    e2.flag=true;
		    push(st,e2);
		    e3.n=e.n-1;e3.x=e.x;e3.y=e.z;e3.z=e.y;
		    if(e3.n==1)
		    e3.flag=true;
		    else
		    e3.flag=false;
		    push(st,e3);
		}
	    else
	    printf("\t将第%d个盘片从%c移动到%c\n",e.n,e.x,e.z);
	}
    destroystack(st);
}

int main(){
	int n=3;
	printf("递归算法：%d个盘片的移动过程：\n",n);
	hanoi1(n,'x','y','z');
	printf("非递归算法：%d个盘片的移动过程：\n",n);
	hanoi2(n,'x','y','z');
	return 1;
}







